sort や sorted は複数回利用することはできない
以下のような sort を行った。
let flavors = try await getFlavors()
.sorted(by: { $0.title < $1.title })
.sorted(by: { $0.categoryName < $1.categoryName })
.sorted(by: { $0.isPrimary && !$1.isPrimary })
このときの意図として
isPrimary
フラグがtrue
のものを先に配置。- 次に
categoryName
でアルファベット順にソート。 - 最後に
title
でアルファベット順にソート。
しかし、このコードでは isPrimary
に基づいて最後にソートされるため、最終的なリストは isPrimary
が true
の要素が先頭に来るようにソートされるが、categoryName
や title
に基づくソート順は保証されない。
正しい振る舞いを実現するためには、ソート条件を一度に組み合わせる必要があり、複数の条件を一つの sorted(by:)
呼び出し内で比較することで達成できる。例えば:
let sortedFlavors = flavors.sorted {
if $0.isPrimary != $1.isPrimary {
return $0.isPrimary && !$1.isPrimary
} else if $0.categoryName != $1.categoryName {
return $0.categoryName < $1.categoryName
} else {
return $0.title < $1.title
}
}